package co.gov.medellin.ssti.sub.paoyer.administration.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;

/**
 * DAO que me permite generar el menu
 * 
 * @author Carlos.Ruiz@consult-soft.com
 * @version 1.0
 */

public class MenuDAO {
	private String strGrupoUsuario;
	private Connection conn;
	private String strPath;

	/**
	 * 
	 * @param strGrupoUsuario
	 *            Codigo del grupo al que pertenece el usuario actualmente
	 *            logeado
	 * @param conn
	 *            Conexion con la base de datos
	 */
	public MenuDAO(String strGrupoUsuario, Connection conn, String strPath) {
		this.strGrupoUsuario = strGrupoUsuario;
		this.conn = conn;
		this.strPath = strPath;
	}

	/**
	 * 
	 * @param conn
	 *            Conexion con la base de datos
	 */
	public void llenarTempMenu(Connection conn) {

		String strSQL = "DELETE TCS_TEMP_MENU_WEB";
		try {
			Statement stm = conn.createStatement();
			int i = stm.executeUpdate(strSQL);
			strSQL = "INSERT INTO TCS_TEMP_MENU_WEB "
					+ "SELECT o1.*, p.tipo_progr, g.gus_codigo, p.ubicacion, p.NOMBRE  "
					+ "FROM TCS_PROGRAMA p, TCS_OPCION o1, TCS_OPCIONES_GRUPO g "
					+ "WHERE p.codigo(+)=o1.prg_codigo "
					+ "AND g.opc_codigo = o1.codigo "
					+ "AND (fcs_val_vigencia(p.vigencia,p.desde_vigencia,p.hasta_vigencia)='S' "
					+ "AND o1.tipo_opcion = 'W')";
			// System.out.println("STRSQL:" + strSQL);
			i = stm.executeUpdate(strSQL);
		} catch (SQLException e) {
			SUBException.logDebugError("", e);
		}
	}

	/**
	 * 
	 * @param strParametros
	 *            Nombre de la aplicacion a la que pertenece el menu
	 * @param conn
	 *            Conexion con la base de datos
	 * @return String con el codigo de la opcion inicial del menu
	 */
	public String getOpcionInicialMenu(Connection conn) {
		String strSQL = "SELECT CODIGO FROM TCS_OPCION "
				+ "WHERE NOMBRE  = 'PAOYER WEB' "
				+ "AND PARAMETROS =  'BENEFICIOS' ";
		try {
			Statement stm = conn.createStatement();
			ResultSet rs = stm.executeQuery(strSQL);
			if (rs.next())
				return rs.getString("CODIGO");
			else
				return null;
		} catch (SQLException e) {
			SUBException.logDebugError("", e);
			return null;
		}
	}

	/**
	 * 
	 * @param strNivelIncio
	 *            Codigo de la opcion con la que se va a iniciar un nodo en el
	 *            arbol del menu
	 * @param conn
	 *            Conexion con la base de datos
	 * @return ResultSet con las opciones hijas del nodo strNivleInicio
	 */
	public ResultSet getOpciones(String strNivelIncio, Connection conn) {
		String strSQL = "SELECT UPPER(DECODE(o.tipo_opcion, 'W', UPPER(o.nombre), INITCAP(o.nombre))) "
				+ "nombre,TO_CHAR(o.codigo) codigo_hijo, DECODE(o.ubicacion,null,'#','"
				+ strPath
				+ "'||o.ubicacion) ubicacion "
				+ "FROM (SELECT * FROM TCS_TEMP_MENU_WEB WHERE gus_codigo = "
				+ strGrupoUsuario
				+ " ) o "
				+ "WHERE (o.opc_codigo=?) AND o.CAMPO_A1 IS NULL "
				+ "ORDER BY o.orden";
		// System.out.println("query: " + strSQL + "; " + strNivelIncio);
		try {
			PreparedStatement pstm = conn.prepareStatement(strSQL);
			pstm.setString(1, strNivelIncio);
			ResultSet rs = pstm.executeQuery();
			return rs;
		} catch (SQLException e) {
			SUBException.logDebugError("", e);
			return null;
		}
	}

	/**
	 * 
	 * @param strNivel
	 *            Indica el nivel del nodo, top es nivel 1, sub es nivel 2 sub2
	 *            es nivel 3
	 * @param strNombre
	 *            Nombre que se le va a dar al nodo
	 * @param strUrl
	 *            Url a la que apunta el nodo
	 * @return String con la estructura makeMenu('nivel','nombre','url') y que
	 *         es interpretada por el browser como javascript
	 */
	public String getNodo(String strNivel, String strNombre, String strUrl) {
		String strNodo = "makeMenu('" + strNivel + "','" + strNombre + "','"
				+ strUrl + "');";
		return strNodo;
	}

	/**
	 * 
	 * @return String con el codigo javascript que me genera el menu
	 */
	public String getMenu() {
		String strMenu = "";
		try {
			llenarTempMenu(conn);
			String strNivelInicio = getOpcionInicialMenu(conn);
			ResultSet rsNivel = getOpciones(strNivelInicio, conn);
			while (rsNivel.next()) {
				strMenu += getNodo("top", rsNivel.getString("nombre"),
						rsNivel.getString("ubicacion"));
				ResultSet rsNivel2 = getOpciones(
						rsNivel.getString("codigo_hijo"), conn);
				while (rsNivel2.next()) {
					strMenu += getNodo("sub", rsNivel2.getString("nombre"),
							rsNivel2.getString("ubicacion"));
					ResultSet rsNivel3 = getOpciones(
							rsNivel2.getString("codigo_hijo"), conn);
					while (rsNivel3.next()) {
						strMenu += getNodo("sub2",
								rsNivel3.getString("nombre"),
								rsNivel3.getString("ubicacion"));
					}
					rsNivel3.close();
				}
				rsNivel2.close();
			}
			rsNivel.close();
			// System.out.println("strMenu: " + strMenu + "\"");
			return strMenu + "\"";
		} catch (Exception e) {
			SUBException.logDebugError("", e);
			return null;
		}

	}

}